package com.modules.baidulib.util;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.LocationManager;
import android.net.Uri;
import android.os.PowerManager;
import android.provider.Settings;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import com.modules.baidulib.R;
import com.modules.baidulib.custom.SelectDialog;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Created by gaolei on 16/12/30.
 */

public class Utils {
  private static PowerManager.WakeLock mWakeLock;
  public static  InputMethodManager    imm;
  Activity activity;

  public Utils(Activity activity) {
    this.activity = activity;
    if (imm == null) {
      imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    }
  }

  public void hideIMM() {
    imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(),
        InputMethodManager.HIDE_NOT_ALWAYS);
  }

  public void showIMM() {
    imm.toggleSoftInput(0, InputMethodManager.RESULT_SHOWN);
  }

  // 距离转换
  public static String distanceFormatter(int distance) {
    if (distance < 1000) {
      return distance + "米";
    } else if (distance % 1000 == 0) {
      return distance / 1000 + "公里";
    } else {
      DecimalFormat df = new DecimalFormat("0.0");
      int a1 = distance / 1000; // 十位

      double a2 = distance % 1000;
      double a3 = a2 / 1000; // 得到个位

      String result = df.format(a3);
      double total = Double.parseDouble(result) + a1;
      return total + "公里";
    }
  }

  // 时间转换
  public static String timeFormatter(int minute) {
    if (minute < 60) {
      return minute + "分钟";
    } else if (minute % 60 == 0) {
      return minute / 60 + "小时";
    } else {
      int hour = minute / 60;
      int minute1 = minute % 60;
      return hour + "小时" + minute1 + "分钟";
    }
  }

  public static int dp2px(Context context, int dp) {
    float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dp * scale + 0.5f);
  }

  public static int px2dp(Context context, int px) {
    float scale = context.getResources().getDisplayMetrics().density;
    return (int) (px / scale + 0.5f);
  }

  public static int getScreenWidth(Context context) {
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics outMetrics = new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(outMetrics);
    return outMetrics.widthPixels;
  }

  public static void setSpannableStr(TextView textView, String str, int startIndex, int endIndex,
      float proporation) {
    SpannableString spannableString = new SpannableString(str);
    ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#393939"));
    spannableString.setSpan(colorSpan, startIndex, endIndex, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    RelativeSizeSpan sizeSpan01 = new RelativeSizeSpan(proporation);
    spannableString.setSpan(sizeSpan01, startIndex, endIndex, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    textView.setText(spannableString);
  }

  public static String getDateFromMillisecond(Long millisecond) {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = new Date(millisecond);
    String dateStr = simpleDateFormat.format(date);
    return dateStr;
  }

  public static void acquireWakeLock(Context context) {
    if (null == mWakeLock) {
      PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
      mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
      mWakeLock.setReferenceCounted(true);
      if (null != mWakeLock) {
        mWakeLock.acquire();
      }
    }
  }

  // 释放设备电源锁
  public static void releaseWakeLock() {
    if (null != mWakeLock) {
      mWakeLock.release();
      mWakeLock = null;
    }
  }

  /**
   * 判断当前应用程序处于前台还是后台
   */
  public static boolean isTopActivity(final Context context) {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
    if (!tasks.isEmpty()) {
      ComponentName topActivity = tasks.get(0).topActivity;
      if (topActivity.getPackageName().equals(context.getPackageName())) {
        return true;
      }
    }
    return false;
  }

  public static boolean isServiceWork(Context mContext, String serviceName) {
    boolean isWork = false;
    ActivityManager myAM = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningServiceInfo> myList = myAM.getRunningServices(1000);
    if (myList.size() <= 0) {
      return false;
    }
    int size = myList.size();
    for (int i = 0; i < size; i++) {
      String mName = myList.get(i).service.getClassName().toString();
      Log.d("gaolei", "mName=" + mName);
      if (mName.equals(serviceName)) {
        isWork = true;
        break;
      }
    }
    return isWork;
  }

  /**
   * 判断GPS是否开启，GPS或者AGPS开启一个就认为是开启的
   *
   * @return true 表示开启
   */
  public static final boolean isGpsOPen(final Context context) {
    LocationManager locationManager =
        (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    // 通过GPS卫星定位，定位级别可以精确到街（通过24颗卫星定位，在室外和空旷的地方定位准确、速度快）
    boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    // 通过WLAN或移动网络(3G/2G)确定的位置（也称作AGPS，辅助GPS定位。主要用于在室内或遮盖物（建筑群或茂密的深林等）密集的地方定位）
    boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    if (gps) {
      return true;
    }

    return false;
  }

  /**
   * 强制帮用户打开GPS
   */
  public static final void openGPS(Context context) {
    Intent GPSIntent = new Intent();
    GPSIntent.setClassName("com.android.settings",
        "com.android.settings.widget.SettingsAppWidgetProvider");
    GPSIntent.addCategory("android.intent.category.ALTERNATIVE");
    GPSIntent.setData(Uri.parse("custom:3"));
    try {
      PendingIntent.getBroadcast(context, 0, GPSIntent, 0).send();
    } catch (PendingIntent.CanceledException e) {
      e.printStackTrace();
    }
  }

  public static void turnGPSOn(Context context) {
    Intent intent = new Intent("Android.location.GPS_ENABLED_CHANGE");
    intent.putExtra("enabled", true);
    context.sendBroadcast(intent);

    String provider = Settings.Secure.getString(context.getContentResolver(),
        Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
    if (!provider.contains("gps")) { //if gps is disabled
      final Intent poke = new Intent();
      poke.setClassName("com.android.settings",
          "com.android.settings.widget.SettingsAppWidgetProvider");
      poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
      poke.setData(Uri.parse("3"));
      context.sendBroadcast(poke);
    }
  }

  public static void showDialog(Context context) {
    SelectDialog selectDialog = new SelectDialog(context, R.style.dialog);//创建Dialog并设置样式主题
    Window win = selectDialog.getWindow();
    WindowManager.LayoutParams params = new WindowManager.LayoutParams();
    //        params.x = -80;//设置x坐标
    //        params.y = -60;//设置y坐标
    params.gravity = Gravity.CENTER;
    win.setAttributes(params);
    selectDialog.setCanceledOnTouchOutside(true);//设置点击Dialog外部任意区域关闭Dialog
    selectDialog.show();
  }

  public static final String APP_BAIDU_MAP = "com.baidu.BaiduMap";
  public static final String APP_AMAP      = "com.autonavi.minimap";

  /**
   * 检测是否有某个应用
   */
  public static boolean hasApp(Context ctx, String packageName) {
    PackageManager manager = ctx.getPackageManager();
    List<PackageInfo> apps = manager.getInstalledPackages(0);
    if (apps != null) {
      for (int i = 0; i < apps.size(); i++) {
        if (apps.get(i).packageName.equals(packageName)) {
          return true;
        }
      }
    }
    return false;
  }
}
